/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = zookeeper_core.h                                              */
/*  NOTE      =                                                               */
/*  DATE      = 2016/08/09 by zhengxd                                         */
/******************************************************************************/
#ifndef _ZOOKEEPER_CORE_H_
#define _ZOOKEEPER_CORE_H_

#include "zookeeper_base_type.h"

/*
 *  分片包数据
*/
typedef struct __st_L7_fragment_zookeeper {

    int i_req_resp;                         /* request/response */
    unsigned int ui_total_len;             /* 数据包总长度 */
    Frbyte_Packet *p_st_data;               /* packet数据 */
    struct timeval st_start_timestamp;     /* 第一个分片包的时间 */
    struct timeval st_end_timestamp;       /* 最后一个分片包的时间 */
} L7_fragment_zookeeper;

/*
 *   L7session_zookeeper 用于存放zookeeper私有的session数据,
 *   对应L7_session的p_session_private变量
 *   通用的username、dbname、hostname、programname
*/
typedef struct __st_L7session_zookeeper {

    struct timeval st_conn;              /* connection时间 */
} L7session_zookeeper;

/*
 *  zookeeper请求
 *  对应L7_requestdata中的p_request_private数据
*/
typedef struct __st_L7_req_zookeeper {

    int i_req_xid;                         /* request XID */
    int i_req_type;                        /* request类型 */
    uint8_t u8_watch_flg;
    unsigned int ui_total_len;            /* 数据包总长度 */
    unsigned long ul_req_sequence;        /* 序列号 */
    unsigned long ul_send_time_us;        /* send time */
    Frlist_header st_data_lst;             /* data list */
    struct timeval st_start_timestamp;    /* 第一个分片包的时间 */
    struct timeval st_end_timestamp;      /* 最后一个分片包的时间 */
} L7_req_zookeeper;

/*
 *  zookeeper响应
 *  解析response过程中的数据
*/
typedef struct __st_L7_resp_zookeeper {

    int i_error_num;                       /* 错误号 */
}L7_resp_zookeeper;

/*
 *  zookeeper私有数据
*/
typedef struct __st_L7session_zookeeper_private {

    L7_fragment_zookeeper *p_st_fragment;   /* 分片包数据 */
    Frhash_header *p_hash_header;           /* 请求列表(L7_req_zookeeper *) */
    L7session_zookeeper *p_st_sess;         /* session数据 */
    L7_resp_zookeeper *p_st_resp;           /* response信息 */
} L7session_zookeeper_private;

int zookeeper_detect(Conntrack *p_st_conn, Apm_packet *p_st_packet);

int zookeeper_analysis(Conntrack *p_st_conn
                    , Apm_packet *p_st_packet
                    , Frhash_header *p_st_hash_report);

int zookeeper_session_destroy(void *p_private_session);

#endif
